<?php

namespace app\common\controller;

use think\Controller;
use think\queue\Job;

/**
 * 后台控制器基类
 */
class CodeJob extends Controller
{

    /**
     * 处理任务
     *
     * @param Job $job 当前任务对象
     * @param array $data 所需数据
     */
    public function fire(Job $job, array $data)
    {
        try {
            // 实现逻辑
            $result=$this->create_code($data);
            // 成功后删除队列任务
            $job->delete();
        } catch (\Exception $e) {
            // 若失败，可根据实际需求决定是否重新入队
            if ($job->attempts() < 3) { // 例如最多重试3次
                $job->release(60); // 在60秒后再次尝试执行
            } else {
                $this->failed($job, $data);
            }
        }
    }


    public function create_code($data){
        $pici_model = new \app\admin\model\Pici;
        $code_model = new \app\admin\model\Code;

        $pici=$pici_model->get(['pici_code'=>$data['pici_code']]);
        if(!$pici){
            return false;
        }
        $serial_number=$pici->start_number;
        $cnum = 1000;//按每次1000个拆分生成总数
        $g_count=$pici->number/$cnum;
        for($u=0; $u<$g_count; $u++)
        {
            if($pici->number<1000){
                $cfnum=$pici->number;
            }else{
                $cfnum=1000;
            }

            $insert_data=[];

            for($i=0;$i<$cfnum;$i++)
            {
                $insert_data[]=[
                    'pici_id'=>$pici->id,
                    'enterp_id'=>$pici->enterp_id,
                    'serial_number'=>$serial_number,
                    'code'=>(string) $this->genRandomString($pici->code_length,$pici->type)
                ];

                $serial_number++;
            }

            $code_model->saveAll($insert_data);
        }
        $pici->end_number=$serial_number-1;
        $pici->state=1;
        $pici->save();
    }
 
    /**
     * 任务执行失败后的回调
     *
     * @param Job $job 当前任务对象
     * @param array $data 邮件发送所需数据
     */
    public function failed(Job $job, array $data)
    {
        // 记录日志或采取其他补救措施
        // Log::record('任务失败，error');
        echo '发送失败';
        // 可考虑在此处通知管理员，或采取其他失败后处理逻辑
    }


    /**
     * 随机字符串，字母＋数字
     * @param int $len 长度
     * @param int $t 模式1：字母，2：数字，3：大写字母，4：大写字母+数字，其他：全部字母+数字
     * @return string
     */
    public function genRandomString($len,$t=0)
    {
        
        $chars1 = array(
            "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );
        $chars2= array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z"
        );

        $chars3 = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "1","2",
            "3", "4", "5", "6", "7", "8", "9"
        );


        if($t==1){

            $charsLen = count($chars1) - 1;

            shuffle($chars1);    // 将数组打乱

            $output = "";
            for ($i=0; $i<$len; $i++)
            {
                $output .= $chars1[mt_rand(0, $charsLen)];
            }

        }elseif($t==2){

           $charsLen = count($chars2) - 1;

            shuffle($chars2);    // 将数组打乱

            $output = "";
            for ($i=0; $i<$len; $i++)
            {
                $output .= $chars2[mt_rand(0, $charsLen)];
            }

        }elseif($t==3){

           $charsLen = count($chars3) - 1;

            shuffle($chars3);    // 将数组打乱

            $output = "";
            for ($i=0; $i<$len; $i++)
            {
                $output .= $chars3[mt_rand(0, $charsLen)];
            }

        }

        return $output;

    }
}

